package com.zzl.bonds.ticket.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zzl.bonds.ticket.dto.CoreEnterpriseCreditAddDto;
import com.zzl.bonds.ticket.dto.CoreEnterpriseCreditUpdateDto;
import com.zzl.bonds.ticket.dto.TicketOpenAddDto;
import com.zzl.bonds.ticket.dto.credit.*;
import com.zzl.bonds.ticket.entity.CoreEnterpriseCreditEntity;
import com.zzl.bonds.ticket.entity.TicketOpenEntity;
import com.zzl.general.common.exception.SysException;
import com.zzl.general.common.serurity.entity.User;
import com.zzl.general.common.utils.PageUtils;

import java.util.List;
import java.util.Map;

/**
 * 核心企业授信表
 *
 * @author sunpp
 * @date 2022-02-16 11:14:07
 */
@SuppressWarnings("javadoc")
public interface CoreEnterpriseCreditService extends IService<CoreEnterpriseCreditEntity> {

    /**
     * 根据 授信id 获取 核心企业授信 或者 分公司集团授信
     *
     * @param creditId 授信id
     */
    CreditQuota getCreditOrQuotaById(String creditId);

    /**
     * 回滚 核心企业的授信 或者 是 集团额度的
     *
     * @param id     授信id
     * @param amount 金额
     * @param user   登录用户
     * @throws SysException 业务异常
     */
    void rollBackCoreCredit(String id, Double amount, User user) throws SysException;

    /**
     * 处理 核心企业 或者厂子的 的冻结 金额
     * 适用 开立中 转让中 融资中 将金额冻结
     *
     * @param id     授信id
     * @param amount 数量
     * @param user   登录用户
     * @throws SysException 业务异常
     */
    void handCoreCredit(String id, Double amount, User user) throws SysException;


    /**
     * 处理 授信的扣减 包括核心企业的授信 或者是 厂子的  集团授信 厂子的独立授信
     *
     * @param id     授信id
     * @param amount 数量
     * @param user   登录用户
     */
    void handReduceCredit(String id, Double amount, User user) throws SysException;

    /**
     * 开立页面 获取 授信的 下拉框
     *
     * @param openEnterpriseId
     * @return
     */
    List<CreditSelectDto> getCreditByOpenEnterpriseId(String openEnterpriseId);

    /**
     * 获取开立授信额度
     *
     * @param ticketOpenAddDto 开单信息
     * @param entity           开单实体
     * @return 授信数据
     */
    InstitutyTemp getOpenCredit(TicketOpenAddDto ticketOpenAddDto, TicketOpenEntity entity) throws SysException;


    List<CoreEnterpriseCreditEntity> getEntityByCoreCreditIds(List<String> ids);

    /**
     * 分页查询
     *
     * @param params 查询参数
     * @return 分页数据
     */
    PageUtils queryPage(Map<String, Object> params, User user) throws SysException;

    /**
     * 新增
     *
     * @param coreEnterpriseCreditAddDto 新增实体
     * @param user                       当前登录用户
     * @throws SysException 业务异常
     */
    void saveCoreEnterpriseCredit(CoreEnterpriseCreditAddDto coreEnterpriseCreditAddDto, User user) throws SysException;

    /**
     * 获取 授信页面的 统计数据
     *
     * @param user 登录用户
     * @return
     */
    StatisticCreditDataDto getOpenData(User user);

    /**
     * 获取 核心企业授信详情
     *
     * @param id 核心企业授信id
     * @return 详情数据v
     * @throws SysException 业务异常
     */
    CoreCreditDetail getCoreCreditDetail(String id) throws SysException;

    /**
     * 获取 集团授信
     *
     * @param id id
     * @return 集团授信
     */
    CoreEnterpriseCreditEntity getEntityById(String id);

    /**
     * 修改
     *
     * @param coreEnterpriseCreditUpdateDto 修改实体
     * @param user                          当前登录用户
     * @throws SysException 业务异常
     */
    void updateCoreEnterpriseCreditById(CoreEnterpriseCreditUpdateDto coreEnterpriseCreditUpdateDto, User user) throws SysException;

    /**
     * 获取 核心企业 授信的 可用金额
     *
     * @return 金额
     */
    Double getCoreAvailableAmount(String id);

    /**
     * 根据 金融机构id 统计核心企业的授信总额度
     *
     * @return
     */
    Map<String, Double> getAllAmountByInstityId();

    /**
     * 新增或者修改 核心企业授信
     *
     * @param addOrUpdateCreditDto dto
     * @param user                 登录用户
     * @throws SysException 业务异常
     */
    void addUpdateCoreCredit(AddOrUpdateCreditDto addOrUpdateCreditDto, User user) throws SysException;

    /**
     * 更新授信状态
     */
    void handCreditStatus();
}

